<?php
namespace Api\Model;
use Think\Model;
/**
 * huhaiqin , 2023.05.30
 * 邮箱发送、邮箱验证相关操作
 * 【邮箱模版】需要通过后台管理起来
 * 【邮箱配置】在Common\Conf\Config.php里面
 */
class EmailModel extends Model{

    /**
     * huhaiqin，2023.05.30
     * 发送邮件
     * xqx 2023.06.11  修改传入参数
     * param $email 注册邮箱
     * param $type 模版类型（在System\View\Admin\email.html里面定义的，被我写死了），可选值reg:注册\findpwd:找回密码\thanks
     */
    public function _send($email = '', $type = ''){
        if(!$email){
            _apiReturn(0,'缺少email参数~');
        }
        if(!$type){
            _apiReturn(0,'缺少type参数~');
        }
        if(!in_array($type,['reg','findpwd','thanks'])){
            _apiReturn(0,'参数有误～');
        }

        //检查email是否可以进行发送邮件验证码
        $checkUser = M('Users')->where(['email' => $email])->find();
        if($type == 'reg' && $checkUser){
            _apiReturn(0,'邮箱已经注册过了，请更换～');
        }
        if($type == 'findpwd' && !$checkUser){
            _apiReturn(0,'账号不存在，请检查～');
        }
        if($type == 'thanks' && !$checkUser){
            _apiReturn(0,'系统不存在该用户，请检查～');
        }
        if($checkUser && $checkUser['status']!=1){
            _apiReturn(0,'该账号已被禁用');
        }
        
        //检测是否已存在有未验证的数据
        $check = $this->where(['email' => $email,'status'=>0])->find(); 
        if($check){
            //如果存在，则表示重发
            $code = $check['code'];
        }else{
            //如果不存在，则表示生成随机数
            $code = rand(100001,999999); //生成随机数
        }

        // 获取email的模版
        $templates = F('EMAIL_TEMPLATE'); //后台配置好的邮箱模版
        $default = C('MAIL_TEMPLATE_DEFAULT'); //配置文件里面的默认模版

        $template = [
            'title' => $templates['title'][$type] ? $templates['title'][$type] : $default['title'],
            'author' => $templates['author'][$type] ? $templates['author'][$type] : $default['author'],
            'template' => $templates['template'][$type] ? $templates['template'][$type] : $default['template']
        ];

        //替换模板参数
        $template['template'] = str_replace('[code]',$code,$template['template']); //替换code
        $template['template'] = str_replace('[name]',$checkUser ? $checkUser['username'] : '',$template['template']); //替换name

        // 4.发送邮件
        $checkSend = sendMail($email, $template['title'], $template['template'],$template['author'],'Dear User'); //这个方法写在 Common/Common/function.php里面，全局函数
        if($checkSend){
            //发送成功，写入数据库
            if($check){
                $data = ['id' => $check['id'],'create_time'=>time()];
                if($this->save($data)){
                    _apiReturn(1,'success'); // 写入数据库成功
                }else{
                    _apiReturn(0,'error'); // 写入数据库失败
                }
            }else{
                //创建数据
                $data = [
                    'email' => $email,
                    'type'=> $type,
                    'code'=> $code,
                    'status' => 0,
                    'create_time' => time()
                ];
                if($this->add($data)){
                    _apiReturn(1,'success'); // 写入数据库成功
                }else{
                    _apiReturn(0,'error'); // 写入数据库失败
                }
            }
        }else{
            _apiReturn(0,'fail to send');//发送失败
        }

        _apiReturn(1,time()-1686484124);
        
    }

    /**
     * huhaiqin , 2023.05.30
     * 校验邮箱验证码，验证通过后，将用户status => 1
     * xqx ,2023.06.12  修改传入参数
     * param email  邮箱
     * param code 用户填写的验证码
     * param type 验证码的用途
     */
    public function _check_code($email = '' , $code = '', $type = 'reg'){
        if(!$email){
            _apiReturn(0,'邮箱不能为空~');
        }
        if(!$code){
            _apiReturn(0,'验证码不能为空~');
        }
        //数据检验成功，写条件
        $map = [
            'email'    => $email,
            'code'   => $code,
            'type'  => $type,
            'status' => 0 //状态必须是0，表示没有校验过的
        ];

        $check = $this->where($map)->find(); //如果能找到满足条件的记录，则表示校验通过
        if($check){
            //检验通过
            $this->save(['id'=>$check['id'],'status'=>1]); //修改掉这条记录的状态，表示已经校验过了
        }else{
            _apiReturn(0,'请检查验证码或邮箱是否正确~');
        }
    }
}